/* plotter.tcc */

#ifndef DODO_PLOTTER_TCC
#define DODO_PLOTTER_TCC

namespace dodo_plot
{

template <class Proj_T>
void Plotter::move_to(const Point& p, const Proj_T extra_proj) const
{
	move_to(extra_proj(p));
}

template <class Proj_T>
void Plotter::line_to(const Point& p, const Proj_T extra_proj) const
{
	line_to(extra_proj(p));
}

// take care with this one.
template <class Proj_T>
void Plotter::rel_line_to(const Point& p, const Proj_T extra_proj) const
{
//TODO : what to do here?
}

template <class Proj_T>
void Plotter::line(const Point& p1, const Point& p2, const Proj_T& extra_proj) const
{
	move_to(p1, extra_proj);
	line_to(p2, extra_proj);
}

//*Iter should be Point
template <class Iter>
void Plotter::polyline(Iter b, Iter e) const
{
	if(b == e)
		return;

	move_to(*b);
	++b;
	for( ; b != e; ++b)
	{
		line_to(*b);
	}
}

template <class Iter, class Proj_T>
void Plotter::polyline(Iter b, Iter e, const Proj_T& extra_proj) const
{
	if(b == e)
		return;

	move_to(*b, extra_proj);
	++b;
	for( ; b != e; ++b)
	{
		line_to(*b, extra_proj);
	}
}

template <class Iter>
void Plotter::polygon(Iter b, Iter e) const
{
	if(b == e)
		return;

	move_to(*b);
	++b;
	for( ; b != e; ++b)
	{
		line_to(*b);
	}
	close_path();
}

template <class Iter, class Proj_T>
void Plotter::polygon(Iter b, Iter e, const Proj_T& extra_proj) const
{
	if(b == e)
		return;
	move_to(*b, extra_proj);
	++b;
	for( ; b != e; ++b)
	{
		line_to(*b, extra_proj);
	}
	close_path();
}

template <class Iter>
void Plotter::polypolygon(Iter b, Iter e) const
{
	typedef typename Iter::value_type container;
	bool has_started = false;
	for( ; b != e; ++b)
	{
		if(b->begin() == b->end())
			continue;
		
		typename container::iterator cb = b->begin();
		if(!has_started)
		{
			begin_new_path();
			has_started = true;
		}
		else
		{
			begin_new_sub_path();
		}
		move_to(*cb);
		++cb;
		for( ; cb != b->end(); ++cb)
		{
			line_to(*cb);
		}
		close_path();
	}
}

template <class Iter, class Proj_T>
void Plotter::polypolygon(Iter b, Iter e, const Proj_T& extra_proj) const
{
	typedef typename Iter::value_type container;
	bool has_started = false;
	for( ; b != e; ++b)
	{
		if(b->begin() == b->end())
			continue;
		
		typename container::iterator cb = b->begin();
		if(!has_started)
		{
			begin_new_path();
			has_started = true;
		}
		else
		{
			begin_new_sub_path();
		}
		move_to(*cb, extra_proj);
		++cb;
		for( ; cb != b->end(); ++cb)
		{
			line_to(*cb, extra_proj);
		}
		close_path();
	}
}


}

#endif //DODO_PLOTTER_TCC
